package thread;

import java.awt.image.VolatileImage;
import java.util.concurrent.atomic.AtomicBoolean;

public class Demo9 {
    /*可见性问题：
      isFinished 是一个普通变量（非 volatile 或非同步变量）。
      在多线程环境下，一个线程对变量的修改可能不会立即被其他线程看到。
      因此，新线程可能一直读取到 isFinished 的旧值（false），导致它无法退出循环。
      JVM 的优化：
      JVM 可能会对代码进行优化，例如将 isFinished 的值缓存到线程的本地内存中。
      即使主线程修改了 isFinished 的值，新线程也可能无法感知到。*/

    public static void main2(String[] args) throws InterruptedException {
        AtomicBoolean isFinished = new AtomicBoolean(false);//保证变量的可见性和原子性
        Thread t=new Thread(()->{
            while(!isFinished.get()){
                System.out.println("Hello t");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("程序终止");
        });
        t.start();
        Thread.sleep(3000);
        isFinished.set(true);
    }
    private static volatile boolean isFinished=false;
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            while(!isFinished){
                System.out.println("Hello t");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("程序终止");
        });
        t.start();
        Thread.sleep(3000);
        isFinished=true;
    }
}
